<?php

namespace nabu\models\adminModel;

defined('NABU') || exit;

require_once 'database/database.php';

use PDOException, nabu\database\database\database;

class adminModel extends database {
  public function __construct() {
    parent::__construct();
  }

  // @return una lista de artículos en espera de aprobación.
  public function sent_articles() {
    $query = 'SELECT a.title, a.slug, u.username AS author FROM articles AS a INNER JOIN users AS u ON a.user_id = u.id ' .
             'WHERE a.authorized = FALSE ORDER BY a.creation_date DESC';

    try {
      $result = $this -> pdo -> prepare($query);

      $result -> execute();

      return $result -> fetchAll();
    }
    catch(PDOException $e) {
      $this -> errors($e -> getMessage(), 'tuvimos un problema para mostrar todos los artículos en espera de aprobación');
    }
  }

  // @return los datos de un artículo dado su 'URL'.
  public function find_article(string $slug) {
    $query = 'SELECT id, title, synopsis, content, cover, slug FROM articles WHERE slug = ? LIMIT 1';

    try {
      $result = $this -> pdo -> prepare($query);

      $result -> execute(array($slug));

      return $result -> fetch();
    }
    catch(PDOException $e) {
      $this -> errors($e -> getMessage(), 'tuvimos un problema para obtener los datos del artículo');
    }
  }

  // @return el 'id' de un artículo dado el 'nombre de la columna de búsqueda'.
  public function article_id(string $column, $data) {
    $query = 'SELECT id FROM articles WHERE ' . $column .' = ? LIMIT 1';

    try {
      $result = $this -> pdo -> prepare($query);

      $result -> execute(array($data));

      $cover = $result -> fetch();

      if ($cover)
        return $cover['id'];

      return $cover;
    }
    catch(PDOException $e) {
      $this -> errors($e -> getMessage(), 'tuvimos un problema para buscar el artículo');
    }
  }

  // Actualiza los datos de un artículo dado su 'id' y los datos a actualizar.
  public function update_article(int $id, array $data) {
    $data['modification_date'] = $this -> current_date();

    $keys  = array_keys($data);
    $query = '';

    foreach ($keys as $key)
      $query = $query . $key . ' = :' . $key . ', ';

    $query = 'UPDATE articles SET ' . rtrim($query, ', ') . ' WHERE id = :id';

    $data['id'] = $id;

    try {
      $this -> pdo -> prepare($query) -> execute($data);
    }
    catch(PDOException $e) {
      $this -> errors($e -> getMessage(), 'tuvimos un problema para actualizar los datos del artículo');
    }
  }

  // @return el 'hash' de la contraseña dado el 'id' de un usuario.
  public function find_password(int $id) {
    $query = 'SELECT password FROM users WHERE id = ? LIMIT 1';

    try {
      $result = $this -> pdo -> prepare($query);

      $result -> execute(array($id));

      $hash = $result -> fetch();

      if ($hash)
        return $hash['password'];

      return $hash;
    }
    catch(PDOException $e) {
      $this -> errors($e -> getMessage(), 'tuvimos un problema para validar tu contraseña');
    }
  }

  // Publica un artículo dado su 'id'.
  public function post_article(int $id) {
    $query = 'UPDATE articles SET authorized = TRUE, modification_date = :modification_date WHERE id = :id';

    try {
      $this -> pdo -> prepare($query) -> execute(array(
        'id'                => $id,
        'modification_date' => $this -> current_date()
      ));
    }
    catch(PDOException $e) {
      $this -> errors($e -> getMessage(), 'tuvimos un problema para publicar el artículo');
    }
  }

  // Elimina un artículo dado su 'id'.
  public function delete_article(int $id) {
    $query = 'DELETE FROM articles WHERE id = ?';

    try {
      $this -> pdo -> prepare($query) -> execute(array($id));
    }
    catch(PDOException $e) {
      $this -> errors($e -> getMessage(), 'tuvimos un problema para eliminar el artículo');
    }
  }

  public function __destruct() {
    parent::__destruct();
  }
}
